/*
 *多文件合并
 */
package filemerge

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
)

type MergeFiles struct {
	ProjectName string
	SourceCode  map[string]string
}

/*
- 文件合并获取代码
- 多文件合并,生成一个文件（sourceCode.lac）
*/
func MergeFilesCode(curRunFilesPath string) (string, map[string]string) {
	currentDir, err := os.Getwd() // 获取当前工作目录
	if err != nil {
		fmt.Println("Error getting current directory:", err)
	}

	// var mf MergeFiles
	mf := &MergeFiles{
		//获取当前工作目录名称
		ProjectName: filepath.Base(currentDir),
		SourceCode:  make(map[string]string),
	}

	//获取所有源码文件
	mf.readFilesCurrentDir(currentDir)

	// 数组源码生成字符串
	sourceCodeAll := mf.arrayToString()

	runFilesPath := "main.la"
	if curRunFilesPath != "" {
		runFilesPath = mf.getPathParts(curRunFilesPath)
	}
	sourceCode := mf.SourceCode[runFilesPath]

	sourceCodeFileName := currentDir + "/sourceCode.lac"
	// 检查文件是否存在
	_, err = os.Stat(sourceCodeFileName)
	if os.IsNotExist(err) {
		//不存在
		//多文件合并成一个文件
		err = ioutil.WriteFile(sourceCodeFileName, []byte(sourceCodeAll), 0644)
		if err != nil {
			fmt.Println("创建文件失败：", err)
		}
	} else {
		//存在
		err = os.Remove(sourceCodeFileName)
		if err != nil {
			fmt.Println("删除文件失败：", err)
		} else {
			// fmt.Println("文件已成功删除")
		}
		//多文件合并成一个文件
		err = ioutil.WriteFile(sourceCodeFileName, []byte(sourceCodeAll), 0644)
		if err != nil {
			fmt.Println("创建文件失败：", err)
		}
	}
	return sourceCode, mf.SourceCode
}

// 数组源码生成字符串
func (mf *MergeFiles) arrayToString() string {
	var codeStr string
	for _, v := range mf.SourceCode { // 遍历文件列表
		codeStr += v + "\n\n"
	}
	return codeStr
}

/*
 * 读取当前目录下的所文件和子目录中的文件
 * dir :当前目录
 */
func (mf *MergeFiles) readFilesCurrentDir(dir string) {

	files, err := os.ReadDir(dir) // 读取当前目录下的所有文件和文件夹
	if err != nil {
		fmt.Println("Error reading directory:", err)
	}
	// 遍历文件和文件夹
	for _, file := range files {
		// fmt.Println(file.Name()) // 打印每个文件或文件夹的名称
		if file.IsDir() {
			fullPath := filepath.Join(dir, file.Name())

			mf.readFilesCurrentDir(fullPath)

		} else {
			/* //跳过main.la文件
			if file.Name() == "main.la" {
				continue
			} */
			//判断文件后缀名是否为 .la
			ext := filepath.Ext(file.Name())
			if ext == ".la" {
				fullPath := filepath.Join(dir, file.Name())

				fileName := mf.getPathParts(fullPath)

				// 使用TrimSuffix去掉文件后缀
				// fileName := strings.TrimSuffix(file.Name(), ".la")
				fileStart := "//====== start " + fileName + " =======\n"
				fileContent := mf.readFiles(fullPath) + "\n"
				fileEnd := "//====== end " + fileName + " =======\n"
				// mf.SourceCode[fileName] = fileStart + fileContent + fileEnd
				mf.SourceCode[fileName] = fileStart + fileContent + fileEnd

			}
		}
	}
}

// 读取文件内容
func (mf *MergeFiles) readFiles(filePath string) string {
	data, err := ioutil.ReadFile(filePath)
	if err != nil {
		fmt.Println("Error reading file:", err)
	}
	return strings.TrimSpace(string(data))
}

// 从路径中获取后半部分
func (mf *MergeFiles) getPathParts(fullPath string) string {

	// 以 '/' 为分隔符分割目录名称，并获取后面部分
	partsPath := strings.Split(fullPath, mf.ProjectName)
	fileName := strings.Replace(partsPath[1][1:len(partsPath[1])], "\\", "/", -1)

	return fileName
}
